package megrez.boot.autoconfigure.okhttp;

import java.io.File;
import java.time.Duration;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.util.unit.DataSize;

import lombok.Data;

/**
 * 配置属性
 * 
 * @author Lucky Yang
 * @since 2.6.9
 */
@Data
@ConfigurationProperties(prefix = "okhttp")
public class OkHttpProperties {
    private boolean enabled;
    /**
     * 连接超时，默认：10秒
     */
    private Duration connectTimeout = Duration.ofSeconds(10);

    /**
     * 读取超时，默认：10秒
     */
    private Duration readTimeout = Duration.ofSeconds(10);

    /**
     * 写入超时，默认：10秒
     */
    private Duration writeTimeout = Duration.ofSeconds(10);

    /**
     * 客户端初始化ping操作间隔时间。客户端自动发送ping帧，一直到连接失败或关闭。
     * 这将使连接保持活动状态，并可能及早检测到连接故障
     *
     * <p>
     * 默认值0表示禁用客户端ping操作.
     */
    private Duration pingInterval = Duration.ZERO;

    @NestedConfigurationProperty
    private CacheProperties cache = new CacheProperties();

    /**
     * 是否ssl重定向, 默认： true
     */
    private boolean followSslRedirects = true;

    /**
     * 是否重定向, 默认：true
     */
    private boolean followRedirects = true;

    /**
     * 遇到连接问题时是否重试, 默认：true
     */
    private boolean retryOnConnectionFailure = true;

    @NestedConfigurationProperty
    private final ConnectionPoolProperties connectionPool = new ConnectionPoolProperties();

    /**
     * 
     * 缓存配置
     *
     * @author Lucky Yang
     * @since 2.6.9
     * 
     * @see okhttp3.Cache
     */
    @Data
    public static class CacheProperties {

        /**
         * 启用标志
         */
        private boolean enabled;

        /**
         * 缓存存储最大字节数，默认：10M
         */
        private DataSize maxSize = DataSize.ofMegabytes(10);

        /**
         * 缓存存储文件系统路径.
         */
        private File directory;
    }

    /**
     * 
     * 连接配置
     *
     * @author Lucky Yang
     * @since 2.6.9
     * 
     * @see okhttp3.ConnectionPool
     */
    @Data
    public static class ConnectionPoolProperties {

        /**
         * 每个地址的最大空闲连接数， 默认：5
         */
        private int maxIdleConnections = 5;

        /**
         * 保存活动间隔时间，默认：5分钟
         */
        private Duration keepAliveDuration = Duration.ofMinutes(5);
    }
}
